package com.client;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.ImageObserver;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;

import com.donnees.dao.DAOFactory;
import com.metier.logique.MSG;
import javax.swing.ImageIcon;
import javax.swing.JSeparator;
import java.awt.Button;
import java.awt.Component;
import javax.swing.Box;
import javax.swing.JComboBox;
import java.awt.ComponentOrientation;
import javax.swing.SpringLayout;
import javax.swing.UIManager;
import javax.swing.JEditorPane;
import com.metier.logique.JGoogleMapEditorPan;
import com.metier.persistance.Carte;
import com.metier.persistance.Poi;
import com.sun.xml.internal.bind.v2.TODO;

import javax.swing.BoxLayout;
import java.awt.Font;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JList;
import java.awt.Frame;
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.LayeredHighlighter;
import javax.swing.ListSelectionModel;
import java.awt.Cursor;
import javax.swing.JLayeredPane;


/**
 * @name FenetrePrincipale
 * @description Fenêtre principale du programme, lancée via le threadApplication.
 * 				Gère tous les évènements sur cette fenêtre.
 * 				Construit l'ensemble de son contenu et instancie les objets nécessitants la récupération des données de la BDD.
 * @method FenetrePrincipale - Constructeur principal.
 * @method defineListeners - Définit les écouteurs de la classe pour les évènements de souris, clavier et de fenêtre.
 * @method defineWindowAttributes - Défini les attributs principaux de la fenêtre. (Nom, taille, etc.)
 * @method buildMainMenu - Construit le menu principal de la fenêtre.
 * @method buildContentWindow - Construit le menu principal de la fenêtre.
 * @method refreshTableOfContacts - Rafraîchit la Table contenant les personnes.
 * 
 * @author Ambroise
 * @since 07/03/2012
 */
public class FenetrePrincipale extends JFrame implements ActionListener, MouseListener, WindowListener, KeyListener, ListSelectionListener{

	private static final long serialVersionUID = 1L;
	
	private DAOFactory fabrique;
	
	private JMenuBar oJMenuBarPrincipal;
	
	private JMenu oJMenuFichier;
		private JMenuItem oJMenuFichierQuitter;
		
	private JMenu oJMenuAide;
		private JMenuItem oJMenuAideAPropos;

	/*
	 * Zone haut-gauche
	 * Menu de gestion des contacts
	 */
	private JPanel menuGestionContacts;
		private JLabel titreMenuGestionContact;
		private JButton listeContacts;
		private JButton ajouterContact;
		private JButton contacter;
	
	/*
	 * Zone bas-gauche
	 * Fonction rechercher
	 */
	private JPanel rechercheRapide;
		private JLabel titreRechercheRapide;
		private JTextField txtRechercherUnContact;
		private JLabel lblRechercheAvance;
		private JButton rechercherContact;
		
	/*
	 * Zone droite
	 * Informations sur les contacts
	 */
	private JPanel informationsContacts;
		private JScrollPane scrollTableContacts;
		private JTable tableContacts;
			private JButton tableContactsSupprimerContact;
			
	/*
	 * Objets relatifs à la fenêtre complète.
	 */
	private JSplitPane separateurHorizontal;
	private JSplitPane separateurVertical;
	private JToolBar oJToolbarPrincipale;
	private JButton btnPrecedent;
	private JButton btnSuivant;
	private JMenu oJMenuHistorique;
	private JMenuItem oJMenuHistorique1;
	private JMenuItem oJMenuHistorique2;
	private JMenuItem oJMenuHistorique3;
	private JMenuItem oJMenuHistoriqueComplet;
	private JSeparator separator;
	private Component horizontalStrut;
	private JButton btnToggleConEdit;
	private Component horizontalStrut_1;
	private boolean consultation = true;
	private boolean ajouterPOI = false;
	private JLabel lblConEdit;
	private Component horizontalStrut_2;
	private JTextField txtRecherche;
	private JLabel lblParcours;
	private JList listParcours;
	private JList listPOI;
	private JLayeredPane oJPanelGoogleMap;
	private JGoogleMapEditorPan googleMapEditorPan;
	private JButton btnAjouterLieu;
	private JButton btnAjouterPOI;
	private JButton btnSupprimerPOI;
	private JButton btnAjouterParcours;
	private JButton btnSupprimerParcours;
	private Vector<String> vectorListPoi = new Vector<String>();
	private JScrollPane scrollPane_1;
	private JLabel poiComp;
	private JComboBox cbbLieu;
	private JComboBox cbbTypeMap;
	
	
	/**
	 * @description Constructeur principal
	 */
	public FenetrePrincipale() {
		
		// On définit par qui sont récupérés les évènements.
		defineListeners();
		
		// On définit les éléments spécifiques à la fenêtre.
		defineWindowAttributes();
		
		// On construit le menu principal de la fenêtre.
		buildMainMenu();
		
		this.setVisible(true);
	}
	
	/**
	 * @name defineListeners
	 * @description Définit les écouteurs de la classe pour les évènements de souris, clavier et de fenêtre.
	 */
	public void defineListeners(){
		this.addWindowListener(this);
		this.addKeyListener(this);
		this.addMouseListener(this);
	}
	
	/**
	 * @name defineWindowAttributes
	 * @description Défini les attributs principaux de la fenêtre. (Nom, taille, etc.)
	 */
	public void defineWindowAttributes(){
		// On définit le titre de la fenêtre.
		this.setTitle("MiniSIG");
		
        this.setLocationRelativeTo(null);
        
        // On définit une taille de base. (La fenêtre sera automatiquement agrandie par la suite)
        this.setSize(800, 600);
        this.setMinimumSize(new Dimension(910, 600));
        this.setPreferredSize(new Dimension(800, 600));
        
        // Le bouton fermer quitte le processus.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // On défini la position de la fenêtre si elle est rétrécie. Au centre de l'écran. À peu près.
        this.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()/4, (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/4);
	}
	
	/**
	 * @name buildMainMenu
	 * @description Construit le menu principal de la fenêtre.
	 */
	public void buildMainMenu(){
		// On construit le menu principal.
		this.oJMenuBarPrincipal = new JMenuBar();
          
    	
	    // Menu déroulante de l'aide.
    	this.oJMenuAide = new JMenu("Aide");
    	
        // À propos
        this.oJMenuAideAPropos = new JMenuItem("À propos");
        this.oJMenuAideAPropos.addActionListener(this);
        
        // Menu déroulant de gestion des contacts
        this.oJMenuFichier = new JMenu("Fichier");
        
        // Quitter
        this.oJMenuFichierQuitter = new JMenuItem("Quitter");
        this.oJMenuFichierQuitter.addActionListener(this);
        this.oJMenuFichier.add(this.oJMenuFichierQuitter);
        
        // Ajout du menu au menu principal.
        this.oJMenuBarPrincipal.add(this.oJMenuFichier);
        
        oJMenuHistorique = new JMenu("Historique");
        oJMenuBarPrincipal.add(oJMenuHistorique);
        
        oJMenuHistorique1 = new JMenuItem("Element 1");
        oJMenuHistorique.add(oJMenuHistorique1);
        
        oJMenuHistorique2 = new JMenuItem("Element 2");
        oJMenuHistorique.add(oJMenuHistorique2);
        
        oJMenuHistorique3 = new JMenuItem("Element 3");
        oJMenuHistorique.add(oJMenuHistorique3);
        
        separator = new JSeparator();
        oJMenuHistorique.add(separator);
        
        oJMenuHistoriqueComplet = new JMenuItem("Historique complet");
        oJMenuHistorique.add(oJMenuHistoriqueComplet);
        this.oJMenuAide.add(this.oJMenuAideAPropos);
        
        // Ajout du menu au menu principal.
        this.oJMenuBarPrincipal.add(this.oJMenuAide);
	    
        // On définit notre MenuBarPrincipal comme MenuBar de la fenêtre principale.
		this.setJMenuBar(this.oJMenuBarPrincipal);
		
		oJToolbarPrincipale = new JToolBar();
		oJToolbarPrincipale.setFloatable(false);
		
		btnPrecedent = new JButton("");
		btnPrecedent.setEnabled(false);
		btnPrecedent.setFocusable(false);
		btnPrecedent.setBorder(null);
		btnPrecedent.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONPREC.png")));
		oJToolbarPrincipale.add(btnPrecedent);
		
		horizontalStrut_1 = Box.createHorizontalStrut(10);
		oJToolbarPrincipale.add(horizontalStrut_1);
		
		btnSuivant = new JButton("");
		btnSuivant.setEnabled(false);
		btnSuivant.setBackground(UIManager.getColor("ToolBar.dockingBackground"));
		btnSuivant.setBorder(null);
		btnSuivant.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONSUIV.png")));
		oJToolbarPrincipale.add(btnSuivant);
		
		horizontalStrut = Box.createHorizontalStrut(130);
		oJToolbarPrincipale.add(horizontalStrut);
		
		btnToggleConEdit = new JButton("");
		btnToggleConEdit.addActionListener(this);
		btnToggleConEdit.setBorder(null);
		btnToggleConEdit.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONCON.png")));
		oJToolbarPrincipale.add(btnToggleConEdit);
		
		horizontalStrut_2 = Box.createHorizontalStrut(10);
		oJToolbarPrincipale.add(horizontalStrut_2);
		
		lblConEdit = new JLabel("Consultation : ");
		oJToolbarPrincipale.add(lblConEdit);
		
		cbbLieu = new JComboBox();
		cbbLieu.setMaximumSize(new Dimension(120, 24));
		oJToolbarPrincipale.add(cbbLieu);
		
		Component horizontalStrut_3 = Box.createHorizontalStrut(100);
		oJToolbarPrincipale.add(horizontalStrut_3);
		
		txtRecherche = new JTextField();
		txtRecherche.setText("Recherche");
		txtRecherche.setMaximumSize(new Dimension(100, 50));
		oJToolbarPrincipale.add(txtRecherche);
		txtRecherche.setColumns(10);
		
		JComboBox cbbTypeRecherche = new JComboBox();
		cbbTypeRecherche.setMaximumSize(new Dimension(90, 50));
		oJToolbarPrincipale.add(cbbTypeRecherche);
		cbbTypeRecherche.addItem("POI");
		cbbTypeRecherche.addItem("Lieu");
		cbbTypeRecherche.addItem("Parcours");
		
		JPanel panelPrincipal = new JPanel();
		panelPrincipal.setMinimumSize(new Dimension(665, 513));
		
		JLabel lblTypeMap = new JLabel("Type : ");
		
		cbbTypeMap = new JComboBox();
		cbbTypeMap.addItem("Terrain");
		cbbTypeMap.addItem("Roadmap");
		cbbTypeMap.addItem("Satellite");
		cbbTypeMap.addItem("Hybrid");
		
		//Setting the Google Map up
		try {
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		JPanel oJPanelMenuGauche = new JPanel();
		oJPanelMenuGauche.setMinimumSize(new Dimension(244, 513));
		
		JLabel lblPoi = new JLabel("POI :");
		
		JSeparator separator_1 = new JSeparator();
		
		lblParcours = new JLabel("Parcours :");
		GroupLayout groupLayout = new GroupLayout(getContentPane());
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addComponent(oJToolbarPrincipale, GroupLayout.PREFERRED_SIZE, 1920, GroupLayout.PREFERRED_SIZE)
				.addGroup(groupLayout.createSequentialGroup()
					.addGap(3)
					.addComponent(panelPrincipal, GroupLayout.PREFERRED_SIZE, 656, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(oJPanelMenuGauche, GroupLayout.PREFERRED_SIZE, 232, Short.MAX_VALUE)
					.addGap(1023))
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addComponent(oJToolbarPrincipale, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
						.addComponent(panelPrincipal, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
						.addComponent(oJPanelMenuGauche, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
					.addGap(278))
		);
		
		btnAjouterLieu = new JButton("Ajouter un lieu");
		btnAjouterLieu.setVisible(false);
		btnAjouterLieu.setEnabled(false);
		
		oJPanelGoogleMap = new JLayeredPane();
		
		GroupLayout gl_panelPrincipal = new GroupLayout(panelPrincipal);
		gl_panelPrincipal.setHorizontalGroup(
			gl_panelPrincipal.createParallelGroup(Alignment.TRAILING)
				.addGroup(gl_panelPrincipal.createSequentialGroup()
					.addComponent(lblTypeMap, GroupLayout.PREFERRED_SIZE, 61, GroupLayout.PREFERRED_SIZE)
					.addGap(16)
					.addComponent(cbbTypeMap, GroupLayout.PREFERRED_SIZE, 88, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED, 341, Short.MAX_VALUE)
					.addComponent(btnAjouterLieu)
					.addGap(20))
				.addGroup(Alignment.LEADING, gl_panelPrincipal.createSequentialGroup()
					.addComponent(oJPanelGoogleMap, GroupLayout.DEFAULT_SIZE, 644, Short.MAX_VALUE)
					.addContainerGap())
		);
		gl_panelPrincipal.setVerticalGroup(
			gl_panelPrincipal.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelPrincipal.createSequentialGroup()
					.addGap(10)
					.addGroup(gl_panelPrincipal.createParallelGroup(Alignment.LEADING)
						.addComponent(lblTypeMap, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
						.addGroup(gl_panelPrincipal.createParallelGroup(Alignment.BASELINE)
							.addComponent(cbbTypeMap, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
							.addComponent(btnAjouterLieu, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(oJPanelGoogleMap, GroupLayout.PREFERRED_SIZE, 462, GroupLayout.PREFERRED_SIZE)
					.addGap(38))
		);
		googleMapEditorPan = new JGoogleMapEditorPan();
		oJPanelGoogleMap.setLayer(googleMapEditorPan, 0);
		googleMapEditorPan.setBounds(0, 0, 632, 450);
		oJPanelGoogleMap.add(googleMapEditorPan);
		googleMapEditorPan.addMouseListener(this);
		googleMapEditorPan.setFocusable(false);
		googleMapEditorPan.setRoadmap("");
		googleMapEditorPan.setMinimumSize(new Dimension(630, 450));
		googleMapEditorPan.setZoom(12);
		googleMapEditorPan.setWidth(630);
		googleMapEditorPan.setHeight(450);
		try {
			googleMapEditorPan.getMapByLocation("Londre", "Angleterre");
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		panelPrincipal.setLayout(gl_panelPrincipal);
		
		btnAjouterPOI = new JButton("Ajouter");
		btnAjouterPOI.setVisible(false);
		btnAjouterPOI.setEnabled(false);
		btnAjouterPOI.addActionListener(this);
		
		btnSupprimerPOI = new JButton("Supprimer");
		btnSupprimerPOI.setVisible(false);
		btnSupprimerPOI.setEnabled(false);
		
		btnAjouterParcours = new JButton("Ajouter");
		btnAjouterParcours.setVisible(false);
		btnAjouterParcours.setEnabled(false);
		
		btnSupprimerParcours = new JButton("Supprimer");
		btnSupprimerParcours.setVisible(false);
		btnSupprimerParcours.setEnabled(false);
		
		JScrollPane scrollPane = new JScrollPane();
		
		scrollPane_1 = new JScrollPane();
		
		
		GroupLayout gl_oJPanelMenuGauche = new GroupLayout(oJPanelMenuGauche);
		gl_oJPanelMenuGauche.setHorizontalGroup(
			gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
					.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addGap(9)
							.addComponent(lblPoi, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
							.addGap(322))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
								.addComponent(separator_1, GroupLayout.PREFERRED_SIZE, 224, GroupLayout.PREFERRED_SIZE)
								.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
									.addComponent(btnAjouterPOI)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(btnSupprimerPOI))))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 197, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(lblParcours))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, 201, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
							.addContainerGap()
							.addComponent(btnAjouterParcours)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(btnSupprimerParcours, GroupLayout.PREFERRED_SIZE, 107, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap())
		);
		gl_oJPanelMenuGauche.setVerticalGroup(
			gl_oJPanelMenuGauche.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_oJPanelMenuGauche.createSequentialGroup()
					.addGap(11)
					.addComponent(lblPoi, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 158, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnAjouterPOI)
						.addComponent(btnSupprimerPOI))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(separator_1, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(lblParcours, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_oJPanelMenuGauche.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnAjouterParcours)
						.addComponent(btnSupprimerParcours))
					.addContainerGap(53, Short.MAX_VALUE))
		);
		
		listParcours = new JList();
		scrollPane_1.setViewportView(listParcours);
		
		listPOI = new JList(vectorListPoi);
		listPOI.addListSelectionListener(this);
		scrollPane.setViewportView(listPOI);
		listPOI.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		oJPanelMenuGauche.setLayout(gl_oJPanelMenuGauche);
		getContentPane().setLayout(groupLayout);
		
		afficherPois();
	}

	/**
	 * @name buildContentWindow
	 * @description Construit le contenu de la fenêtre, les éléments, etc.
	 * @param MSG personnes
	 */
	public void buildContentWindow(MSG personnes){
		
	}

	/*
	 * ************************************************************************************************************
	 * ************************************** Gestion des évènements **********************************************
	 * ************************************************************************************************************
	 */
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	
	
	@Override
	public void mouseClicked(MouseEvent e) {
		Object source = e.getSource();
		if (source == googleMapEditorPan && !consultation && ajouterPOI)
		{
			this.ajouterPoi(e);
		}
	
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		
		//Toggle between Consultation and Edition mode.
		if (source == btnToggleConEdit)
		{
			if (consultation)
			{
				
				//Changing the button icon
				btnToggleConEdit.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONEDIT.png"))); 
				lblConEdit.setText("           Edition : ");
				
				//Displays and enables editing buttons.
				btnAjouterLieu.setVisible(true);
				btnAjouterLieu.setEnabled(true);
				
				btnAjouterPOI.setVisible(true);
				btnAjouterPOI.setEnabled(true);
				
				btnSupprimerPOI.setVisible(true);
				btnSupprimerPOI.setEnabled(true);
				
				btnAjouterParcours.setVisible(true);
				btnAjouterParcours.setEnabled(true);
				
				btnSupprimerParcours.setVisible(true);
				btnSupprimerParcours.setEnabled(true);
				
				btnAjouterLieu.setVisible(true);
				btnAjouterLieu.setEnabled(true);
				
				//Set consultation boolean to false
				consultation = false;
				
			} else {
				
				
				btnToggleConEdit.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/ICONCON.png"))); 
				lblConEdit.setText("Consultation : ");
				
				//Hides and disables editing buttons.
				btnAjouterPOI.setVisible(false);
				btnAjouterPOI.setEnabled(false);
				
				btnSupprimerPOI.setVisible(false);
				btnSupprimerPOI.setEnabled(false);

				btnAjouterParcours.setVisible(false);
				btnAjouterParcours.setEnabled(false);			

				btnSupprimerParcours.setVisible(false);
				btnSupprimerParcours.setEnabled(false);
				
				btnAjouterLieu.setVisible(false);
				btnAjouterLieu.setEnabled(false);
				
				consultation = true;
			}
		}else if (source == btnAjouterPOI){
			if (!ajouterPOI){
				//Changes the cursor to a crosshair
				googleMapEditorPan.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
				ajouterPOI = true;
				btnAjouterPOI.setText("Annuler");
			}else {
				//Puts the cursor back to normal
				googleMapEditorPan.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
				ajouterPOI = false;
				btnAjouterPOI.setText("Ajouter");
			}
		}
	}
	
	@Override
	public void valueChanged(ListSelectionEvent e) {
		// TODO Auto-generated method stub
		if (listPOI.getSelectedIndex() == -1){
			System.out.println("No selection.");			
		} else {
			System.out.println("Item : "+listPOI.getSelectedValue()+" selected.");
		}
		
	}
	
	//-------------------------------------------------------------------------------------------------
	//-----------------------------------Marvin's Methods----------------------------------------------
	//-------------------------------------------------------------------------------------------------
	public void ajouterPoi(MouseEvent e){
		// TODO Implement Add method.
	}
	
	/**
	 * @author marvin
	 * @description Process displaying all the POIs according to the selected map in the cbbLieu.
	 */
	public void afficherPois(){

		//System.out.println("X :" + e.getX() + " - Y :" + e.getY());
		cbbLieu.addItem("Londres");
		
		vectorListPoi.clear();
		
		MSG oMSG = new MSG();
		Carte oCarte = new Carte();
		Poi oPOI = new Poi();
		List oList = new ArrayList();
		
		//Getting the current map's ID
		oMSG.setData("method", "findByName");
		oMSG.setData("chaine", cbbLieu.getSelectedItem().toString());
		oMSG = oCarte.find(oMSG);
		String type = oMSG.getData("typeDonnees").toString();
		if(type.equals("object")){
			oCarte = (Carte) oMSG.getData("donnees");
		} else if(type.equals("list")){
					
		}
		
		System.out.println(oMSG.getData("donnees").toString());
		//Getting all the POIs associated with the map
		oMSG = new MSG();
		oMSG.setData("method", "findByCarteId");
		oMSG.setData("carteId", oCarte.getIdCarte());
		oMSG = oPOI.find(oMSG);
		type = oMSG.getData("typeDonnees").toString();
		if(type.equals("object")){
			oPOI = (Poi) oMSG.getData("donnees");
			oList.add(oPOI);
		} else if(type.equals("list")){
			oList = (ArrayList) oMSG.getData("donnees");
		}
			

		Iterator i = oList.iterator();
		
		while (i.hasNext()){
			oPOI = (Poi) i.next();
			afficherUnPoi(oPOI);
		}
		
	}
	
	/**
	 * @author marvin
	 * @description Displays a POI by generating a Label a the right coordinates in the oJPanelGoogleMap.
	 * @param oPOI - The POIs to display
	 */
	public void afficherUnPoi(Poi oPOI){
		poiComp = new JLabel(new ImageIcon(FenetrePrincipale.class.getResource("/ICONPOI.png")));
		poiComp.setBounds(oPOI.getX().intValue(), oPOI.getY().intValue(), 32, 37);
		poiComp.setVisible(true);
		poiComp.setToolTipText(oPOI.getNom());
		poiComp.setName(oPOI.getIdPoi().toString());
		poiComp.addMouseListener(this);
		poiComp.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent arg0) {	
			}
			
			@Override
			public void mousePressed(MouseEvent arg0) {
			}
			
			@Override
			public void mouseExited(MouseEvent arg0) {
			}
			
			@Override
			public void mouseEntered(MouseEvent arg0) {
			}
			
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if (consultation) {
					//Allow consulting and editing POIs details
					JLabel o = (JLabel)arg0.getComponent();
					DialogDetailsPOI oDetail = new DialogDetailsPOI(o);
					oDetail.setVisible(true);
					afficherPois(); //Refresh the POIs on the main window
				}

			}
		});
		
		oJPanelGoogleMap.add(poiComp, new Integer(1), 0);
		oJPanelGoogleMap.moveToFront(poiComp);
		vectorListPoi.add(oPOI.getNom());
		listPOI.updateUI();
	}
}
